vulkan: Move descriptor set layout to the render object
authorMatthias Clasen <mclasen@redhat.com>
Fri, 22 Sep 2017 14:02:27 +0000 (10:02 -0400)
committerMatthias Clasen <mclasen@redhat.com>
Sat, 23 Sep 2017 02:16:09 +0000 (22:16 -0400)
We want to maintain a single descriptor set layout while introducing
multiple pipeline layouts, so split this off.

gsk/gskvulkanpipeline.c
gsk/gskvulkanpipelineprivate.h
gsk/gskvulkanrender.c

index 71ea27e814ce55f2b71cd44337f27ec92d3463f0..5863d20e35b4ad326390f4ccfe7d2f5e4612751d 100644 (file)
@@ -15,7 +15,6 @@ struct _GskVulkanPipelineLayout
   GdkVulkanContext *vulkan;
 
   VkPipelineLayout pipeline_layout;
-  VkDescriptorSetLayout descriptor_set_layout;
 };
 
 struct _GskVulkanPipelinePrivate
@@ -190,7 +189,8 @@ gsk_vulkan_pipeline_get_pipeline (GskVulkanPipeline *self)
 /*** GskVulkanPipelineLayout ***/
 
 GskVulkanPipelineLayout *
-gsk_vulkan_pipeline_layout_new (GdkVulkanContext *context)
+gsk_vulkan_pipeline_layout_new (GdkVulkanContext      *context,
+                                VkDescriptorSetLayout *descriptor_set_layout)
 {
   GskVulkanPipelineLayout *self;
   VkDevice device;
@@ -201,27 +201,11 @@ gsk_vulkan_pipeline_layout_new (GdkVulkanContext *context)
 
   device = gdk_vulkan_context_get_device (context);
 
-  GSK_VK_CHECK (vkCreateDescriptorSetLayout, device,
-                                             &(VkDescriptorSetLayoutCreateInfo) {
-                                                 .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO,
-                                                 .bindingCount = 1,
-                                                 .pBindings = (VkDescriptorSetLayoutBinding[1]) {
-                                                     {
-                                                         .binding = 0,
-                                                         .descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
-                                                         .descriptorCount = 1,
-                                                         .stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT
-                                                     }
-                                                 }
-                                             },
-                                             NULL,
-                                             &self->descriptor_set_layout);
-
   GSK_VK_CHECK (vkCreatePipelineLayout, device,
                                         &(VkPipelineLayoutCreateInfo) {
                                             .sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO,
                                             .setLayoutCount = 1,
-                                            .pSetLayouts = &self->descriptor_set_layout,
+                                            .pSetLayouts = descriptor_set_layout,
                                             .pushConstantRangeCount = gst_vulkan_push_constants_get_range_count (),
                                             .pPushConstantRanges = gst_vulkan_push_constants_get_ranges ()
                                         },
@@ -255,10 +239,6 @@ gsk_vulkan_pipeline_layout_unref (GskVulkanPipelineLayout *self)
                            self->pipeline_layout,
                            NULL);
 
-  vkDestroyDescriptorSetLayout (device,
-                                self->descriptor_set_layout,
-                                NULL);
-
   g_slice_free (GskVulkanPipelineLayout, self);
 }
 
@@ -268,10 +248,3 @@ gsk_vulkan_pipeline_layout_get_pipeline_layout (GskVulkanPipelineLayout *self)
 {
   return self->pipeline_layout;
 }
-
-VkDescriptorSetLayout
-gsk_vulkan_pipeline_layout_get_descriptor_set_layout (GskVulkanPipelineLayout *self)
-{
-  return self->descriptor_set_layout;
-}
-
index 504306a714759727b19bda259a475d3331e4f9b2..62550b2bc2db8a11d38bd69b40e4507077e8be53 100644 (file)
@@ -34,15 +34,13 @@ gsk_vulkan_handle_result (VkResult    res,
 
 #define GSK_VK_CHECK(func, ...) gsk_vulkan_handle_result (func (__VA_ARGS__), G_STRINGIFY (func))
 
-GskVulkanPipelineLayout *       gsk_vulkan_pipeline_layout_new          (GdkVulkanContext               *context);
+GskVulkanPipelineLayout *       gsk_vulkan_pipeline_layout_new          (GdkVulkanContext               *context,
+                                                                         VkDescriptorSetLayout          *descriptor_set_layout);
 GskVulkanPipelineLayout *       gsk_vulkan_pipeline_layout_ref          (GskVulkanPipelineLayout        *self);
 void                            gsk_vulkan_pipeline_layout_unref        (GskVulkanPipelineLayout        *self);
 
 VkPipelineLayout                gsk_vulkan_pipeline_layout_get_pipeline_layout
                                                                         (GskVulkanPipelineLayout        *self);
-VkDescriptorSetLayout           gsk_vulkan_pipeline_layout_get_descriptor_set_layout
-                                                                        (GskVulkanPipelineLayout        *self);
-
 
 GskVulkanPipeline *     gsk_vulkan_pipeline_new                         (GType                           pipeline_type,
                                                                          GskVulkanPipelineLayout        *layout,
index 0c96310b0256115e7d41d3bf86513ab930061b37..500eff6db191efa7d1f96fc726699a5eda6e0e5a 100644 (file)
@@ -40,6 +40,7 @@ struct _GskVulkanRender
   GskVulkanCommandPool *command_pool;
   VkFence fence;
   VkRenderPass render_pass;
+  VkDescriptorSetLayout descriptor_set_layout;
   GskVulkanPipelineLayout *layout;
   GskVulkanUploader *uploader;
   GskVulkanBuffer *vertex_buffer;
@@ -176,7 +177,24 @@ gsk_vulkan_render_new (GskRenderer      *renderer,
                                       NULL,
                                       &self->render_pass);
 
-  self->layout = gsk_vulkan_pipeline_layout_new (self->vulkan);
+  GSK_VK_CHECK (vkCreateDescriptorSetLayout, device,
+                                             &(VkDescriptorSetLayoutCreateInfo) {
+                                                 .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO,
+                                                 .bindingCount = 1,
+                                                 .pBindings = (VkDescriptorSetLayoutBinding[1]) {
+                                                     {
+                                                         .binding = 0,
+                                                         .descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
+                                                         .descriptorCount = 1,
+                                                         .stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT
+                                                     }
+                                                 }
+                                             },
+                                             NULL,
+                                             &self->descriptor_set_layout);
+
+
+  self->layout = gsk_vulkan_pipeline_layout_new (self->vulkan, &self->descriptor_set_layout);
 
   self->uploader = gsk_vulkan_uploader_new (self->vulkan, self->command_pool);
 
@@ -447,9 +465,7 @@ gsk_vulkan_render_prepare_descriptor_sets (GskVulkanRender *self,
 
   VkDescriptorSetLayout *layouts = g_newa (VkDescriptorSetLayout, needed_sets);
   for (i = 0; i < needed_sets; i++)
-    {
-      layouts[i] = gsk_vulkan_pipeline_layout_get_descriptor_set_layout (self->layout);
-    }
+    layouts[i] = self->descriptor_set_layout;
 
   GSK_VK_CHECK (vkAllocateDescriptorSets, device,
                                           &(VkDescriptorSetAllocateInfo) {
@@ -650,6 +666,10 @@ gsk_vulkan_render_free (GskVulkanRender *self)
   g_free (self->descriptor_sets);
   g_hash_table_unref (self->descriptor_set_indexes);
 
+  vkDestroyDescriptorSetLayout (device,
+                                self->descriptor_set_layout,
+                                NULL);
+
   vkDestroyFence (device,
                   self->fence,
                   NULL);